android databinding简单心得
介绍
谷歌最近推出了databinding技术,可以在layout文件就是xml中直接绑定数据,不用像以前那样先findViewById()
再setText()
了。其实这个技术微软的开发平台上早就有了,确实很方便的说。
准备
android studio 1.3.0-beta1或更高版本
在gradle里添加databinding
1 | dependencies { |
1 | apply plugin: ‘com.android.application' |
layout文件
根元素必须是layout
,然后是一个data
元素,一个普通的view
元素。比如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
data
里面是绑定的数据user
,android:text="@{user.firstName}"
就是把TextView
的text
属性绑定user
的firstName
属性,很方便吧!
data对象
这个简单,比如User
:1
2
3
4public class User {
private String firstName;
private String lastName;
}
别忘了加上getter和setter,很关键!
binding对象
做完了上面的,就会自动生成一个Binding
类,名字是根据layout文件的名字起的。比如,上面那个layout文件叫做activity_main.xml
,那么就会自动生成一个ActivityMainBinding
类,这个类持有User
和layout
里的所有属性。我创建一个binding
对象并给它设置数据,它就自动把数据绑定到layout里了。比如:1
2
3
4
5
6
7@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Test", "User");
binding.setUser(user);
}
如果是在RecyclerView的Adapter里,可以这样:1
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
深入layout文件
layout文件里支持表达式,比如:1
2
3
4
5<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
但是你用到了View类,必须import
,就像在java文件里那样。比如:1
2
3<data>
<import type="android.view.View"/>
</data>
现在android studio对databinding的支持还不完善,可能写xml的时候很多地方会没有智能提示。。。
具体指南请参考:databinding中文指南(翻译)